0900. RLE 迭代器【中等】
1. 📝 题目描述
我们可以使用游程编码(即 RLE )来编码一个整数序列。在偶数长度 encoding ( 从 0 开始 )的游程编码数组中,对于所有偶数 i,encoding[i] 告诉我们非负整数 encoding[i + 1] 在序列中重复的次数。
- 例如,序列
arr = [8,8,8,5,5]可以被编码为encoding =[3,8,2,5]。encoding =[3,8,0,9,2,5]和encoding =[2,8,1,8,2,5]也是arr有效的 RLE。
给定一个游程长度的编码数组,设计一个迭代器来遍历它。
实现 RLEIterator 类:
RLEIterator(int[] encoded)用编码后的数组初始化对象。int next(int n)以这种方式耗尽后n个元素并返回最后一个耗尽的元素。如果没有剩余的元素要耗尽,则返回-1。
示例 1:
txt
输入:
["RLEIterator","next","next","next","next"]
[[[3,8,0,9,2,5]],[2],[1],[1],[2]]
输出:
[null,8,8,5,-1]
解释:
RLEIterator rLEIterator = new RLEIterator([3, 8, 0, 9, 2, 5]); // 这映射到序列 [8,8,8,5,5]。
rLEIterator.next(2); // 耗去序列的 2 个项,返回 8。现在剩下的序列是 [8, 5, 5]。
rLEIterator.next(1); // 耗去序列的 1 个项,返回 8。现在剩下的序列是 [5, 5]。
rLEIterator.next(1); // 耗去序列的 1 个项,返回 5。现在剩下的序列是 [5]。
rLEIterator.next(2); // 耗去序列的 2 个项,返回 -1。 这是由于第一个被耗去的项是 5,
但第二个项并不存在。由于最后一个要耗去的项不存在,我们返回 -1。1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
提示:
2 <= encoding.length <= 1000encoding.length为偶0 <= encoding[i] <= 10^91 <= n <= 10^9- 每个测试用例调用
next不高于1000次
2. 🎯 s.1 - 模拟
c
typedef struct {
int* encoding;
int size;
int idx;
} RLEIterator;
RLEIterator* rLEIteratorCreate(int* encoding, int encodingSize) {
RLEIterator* obj = (RLEIterator*)malloc(sizeof(RLEIterator));
obj->encoding = (int*)malloc(sizeof(int) * encodingSize);
memcpy(obj->encoding, encoding, sizeof(int) * encodingSize);
obj->size = encodingSize;
obj->idx = 0;
return obj;
}
int rLEIteratorNext(RLEIterator* obj, int n) {
while (obj->idx < obj->size) {
if (obj->encoding[obj->idx] >= n) {
obj->encoding[obj->idx] -= n;
return obj->encoding[obj->idx + 1];
}
n -= obj->encoding[obj->idx];
obj->idx += 2;
}
return -1;
}
void rLEIteratorFree(RLEIterator* obj) { free(obj->encoding); free(obj); }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
js
/**
* @param {number[]} encoding
*/
var RLEIterator = function (encoding) {
this.encoding = encoding
this.idx = 0
}
/**
* @param {number} n
* @return {number}
*/
RLEIterator.prototype.next = function (n) {
while (this.idx < this.encoding.length) {
if (this.encoding[this.idx] >= n) {
this.encoding[this.idx] -= n
return this.encoding[this.idx + 1]
}
n -= this.encoding[this.idx]
this.idx += 2
}
return -1
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
py
class RLEIterator:
def __init__(self, encoding: List[int]):
self.encoding = encoding
self.idx = 0
def next(self, n: int) -> int:
while self.idx < len(self.encoding):
if self.encoding[self.idx] >= n:
self.encoding[self.idx] -= n
return self.encoding[self.idx + 1]
n -= self.encoding[self.idx]
self.idx += 2
return -11
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
- 时间复杂度:所有
next调用总计 ,其中 n 是编码长度 - 空间复杂度:
算法思路:
- 维护当前指针 idx,每次
next(n)消耗 n 个元素 - 若当前段剩余 ≥ n 则直接扣减并返回对应值,否则跳到下一段